JBoss Community Archive (Read Only)

ModeShape 2.8

Java Source File Sequencer

One of the sequencers that included in ModeShape is the modeshape-sequencer-java subproject. This sequencer parses Java source code added to the repository and extracts the basic structure of the classes and enumerations defined in the code. This structure includes: the package structures, class declarations, class and member attribute declarations, class and member method declarations with signature (but not implementation logic), enumerations with each enumeration literal value, annotations, and JavaDoc information for all of the above. After extracting this information from the source code, the sequencer then writes this structure into the repository, where it can be further processed, analyzed, searched, navigated, or referenced.

As noted previously, the JavaMetadataSequencer class provides a pair of JavaBean properties that can be used to specify a custom SourceFileRecorder implementation to use to map the extracted metadata to an output location:

Property

Description

sourceFileRecorder

Optional property that, if set, provides an instance of the SourceFileRecorder interface that will be used for all subsequent sequencing activity for this sequencer. If this property is set to null, a default implementation will be used. The default value of this property is null.

sourceFileRecorderClassName

Optional property that, if set, provides the name of a class that provides a custom implementation of the SourceFileRecorder interface. This class must have a no-argument, public constructor. If set, an instance of this class will be created immediately and reused for all subsequent sequencing activity for this sequencer. If this property is set to null, a default implementation will be used. The default value of this property is null.

JavaMetadataSequencer properties

The default class file recorder (called ClassSourceFileRecorder) is used when these properties are not set, and creates a subgraph rooted at the output location that takes the following form:

<nt:unstructured jcr:name="packageName1"
                 jcr:mixinTypes = "mode:derived"
                 mode:derivedAt="2011-05-13T13:12:03.925Z"
                 mode:derivedFrom="/files/org/modeshape/Foo.java">
	...
    <nt:unstructured jcr:name="packageNameN">
	    <class:class jcr:name="ClassName">
		    <class:annotations jcr:name="class:annotations">
			    <class:annotation jcr:name="AnnotationName1"/>
			    ...
			    <class:annotation jcr:name="AnnotationNameN"/>
		    </class:annotations>
		    <class:constructors jcr:name="class:constructors">
			    <class:constructor jcr:name="constructor parameters">
				    <class:annotation jcr:name="AnnotationName1"/>
				    ...
				    <class:annotation jcr:name="AnnotationNameN"/>
			    </class:constructor>
		    </class:constructors>
		    <class:methods jcr:name="class:methods">
			    <class:method jcr:name="methodName(parameters)">
				    <class:annotation jcr:name="AnnotationName1"/>
				    ...
				    <class:annotation jcr:name="AnnotationNameN"/>
			    </class:method>
		    </class:methods>
		    <class:fields jcr:name="class:fields">
			    <class:field jcr:name="fieldName">
				    <class:annotation jcr:name="AnnotationName1"/>
				    ...
				    <class:annotation jcr:name="AnnotationNameN"/>
			    </class:field>
		    </class:fields>
		  </class:class>
    </nt:unstructured>
	...
</nt:unstructured>

This is the same structure that is produced by the Java class file sequencer, meaning that by default the same structure will be produced when sequencing Java source or class files.

The compact node definitions for the class:* types is provided below:

[class:annotationMember]
- class:name (string) mandatory
- class:value (string)

[class:annotation]
- class:name (string) mandatory
+ * (class:annotationMember) = class:annotationMember

[class:annotations]
+ * (class:annotation) = class:annotation

[class:field]
- class:name (string) mandatory
- class:typeClassName (string) mandatory
- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
- class:static (boolean) mandatory
- class:final (boolean) mandatory
- class:transient (boolean) mandatory
- class:volatile (boolean) mandatory
+ class:annotations (class:annotations) = class:annotations

[class:fields]
+ * (class:field) = class:field

[class:interfaces]
- * (string)

[class:parameters]
- * (string)

[class:method]
- class:name (string) mandatory
- class:returnTypeClassName (string) mandatory
- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
- class:static (boolean) mandatory
- class:final (boolean) mandatory
- class:abstract (boolean) mandatory
- class:strictFp (boolean) mandatory
- class:native (boolean) mandatory
- class:synchronized (boolean) mandatory
- class:parameters (string) multiple
+ class:annotations (class:annotations) = class:annotations

[class:methods]
+ * (class:method) = class:method

[class:constructors]
+ * (class:method) = class:method

[class:class]
- class:name (string) mandatory
- class:superClassName (string)
- class:visibility (string) mandatory < 'public', 'protected', 'package', 'private'
- class:abstract (boolean) mandatory
- class:interface (boolean) mandatory
- class:final (boolean) mandatory
- class:strictFp (boolean) mandatory
- class:interfaces (string) multiple
+ class:annotations (class:annotations) = class:annotations
+ class:constructors (class:constructors) = class:constructors
+ class:methods (class:methods) = class:methods
+ class:fields (class:fields) = class:fields

[class:enum] > class:class
- class:enumValues (string) mandatory multiple

This sequencer defaulted to using a different recorder implementation in ModeShape 1.x, but this earlier structure did not match that produced by the ClassFileSequencer and a different default recorder is used in ModeShape 2.0 (or later). The sequencer can be configured to use the original structure by using the OriginalFormatSourceFileRecorder class.

To use this sequencer, simply include the modeshape-sequencer-java JAR (plus all of the JARs that it is dependent upon) in your application and configure the JcrConfiguration to use this sequencer using something similar to:

JcrConfiguration config = ...

config.sequencer("Java Sequencer")
      .usingClass("org.modeshape.sequencer.java.JavaMetadataSequencer")
      .loadedFromClasspath()
      .setDescription("Sequences java files to extract the characteristics of the Java source")
      .sequencingFrom("//(*.(java)[*])/jcr:content[@jcr:data]")
      .andOutputtingTo("/java/$1");
JBoss.org Content Archive (Read Only), exported from JBoss Community Documentation Editor at 2020-03-11 12:04:46 UTC, last content change 2011-12-06 22:22:23 UTC.